package com.sm.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sm.entity.ResultMap;
import com.sm.entity.UserInfo;
import com.sm.service.UserRoleService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RequestMapping(value = "/admin/user")
public class UserController {

    @Autowired
    private ResultMap resultMap;
    @Autowired
    private UserRoleService userRoleService;

    /**
     * @return 返回个人信息user.jsp视图
     */
    @RequestMapping("/user")
    public String user()throws Exception {
        return "admin/user/user";
    }

    /**
     * @return 返回删除视图
     * @throws Exception
     */
    @RequestMapping(value = "/userdelete")
    public String userDelete() throws Exception {
        return "admin/user/userdelete";
    }
    /**
     * 删除员工  只是修改员工status为0
     * @param uid
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/userdelete.do/{uid}",method = RequestMethod.POST )
    public ResultMap userDeleteDo(@PathVariable("uid")Integer uid) throws Exception {
        userRoleService.deleteUser(uid);
        resultMap.setMessage("删除成功");
        return resultMap;
    }

    /**
     * 跳转添加员工界面
     * @return
     */
    @RequestMapping("/useradd")
    public String userAdd(){
        return "admin/user/useradd" ;
    }

    /**
     * 添加员工信息 权限信息一定要传递 返回成功信息
     * @param userInfo
     * @param admin
     * @return
     * @throws Exception
     */

    @ResponseBody
    @RequestMapping(value = "/useradd.do",method = RequestMethod.POST )
    public ResultMap userAddDo(UserInfo userInfo,@RequestParam(required = true) Integer[] admin) throws Exception {
        userRoleService.addUser(userInfo,admin);
        resultMap.setMessage("员工添加成功");
        return resultMap;
    }

    /**
     * @return 返回视图 用于显示所有员工信息
     */
    @RequestMapping("/usershow")
    public String userShow(){
        return "admin/user/usershow";
    }

    /**
     * 使用分页
     * @return 返回所有员工信息
     * @throws Exception 所有异常
     */
    @ResponseBody
    @RequestMapping("/usershowph.do")
    public ResultMap userShowDo(@RequestParam(value = "pageSize",required = true,defaultValue = "10")Integer pageSize,
                                     @RequestParam(value = "pageNum",required = true,defaultValue = "0")Integer pageNum) throws Exception {
        PageHelper.startPage(pageNum,pageSize);
        List<UserInfo> userInfos = userRoleService.findAllUserByStatus();
        PageInfo<UserInfo> pageInfo = new PageInfo(userInfos);
        resultMap.setResult("result",pageInfo);
        return resultMap;
    }

    /**
     * 不适用分页
     * @return 返回所有员工信息
     * @throws Exception 所有异常
     */
    @ResponseBody
    @RequestMapping("/usershow.do")
    public ResultMap userShowDo() throws Exception {
//        PageHelper.startPage(0,0);
        List<UserInfo> userInfos = userRoleService.findAllUserByStatus();
        PageInfo<UserInfo> pageInfo = new PageInfo(userInfos);
        resultMap.setResult("result",pageInfo);
        return resultMap;
    }

    /**
     * 管理员修改信息 先展示所有员工信息
     * @return 所有信息
     * @throws Exception 所有异常
     */
    @ResponseBody
    @RequestMapping("/usermodify")
    public List<UserInfo> userModify() throws Exception {
        return userRoleService.findAllUserByStatus();
    }

    /**
     * 普通员工，管理员从数据库获取员工个人信息 返回修改界面 使用jap服务器渲染
     * @param uid
     * @param model
     * @return
     * @throws Exception 所有异常
     */
    @RequestMapping("/usermodify/{uid}")
    public String userModifyUid(@PathVariable("uid")Integer uid,Model model) throws Exception {
        UserInfo userInfo = userRoleService.findByUid(uid);
        model.addAttribute("userInfo",userInfo);
        return "admin/user/usermodify" ;
    }

    /**
     * 普通员工，管理员 修改员工信息 不包括权限修改,produces="text/html;charset=UTF-8"
     * @param userInfo
     * @return 所有异常
     */
    @ResponseBody
    @RequestMapping(value = "/usermodify.do",method = RequestMethod.POST )
    public ResultMap userModifyDo(UserInfo userInfo) throws Exception {
        userRoleService.updateUser(userInfo);
        resultMap.setMessage("修改成功");
        return resultMap;
    }

    @ResponseBody
    @RequestMapping(value = "/usermodstatus.do",method = RequestMethod.POST )
    public ResultMap userModifyStatus(UserInfo userInfo,@RequestParam(required = true) Integer[] admin)throws Exception{
        try{
            if(admin==null||admin.length==0)
                throw new NullPointerException("权限为空");
        }catch (Exception e){}
        userRoleService.updateUser(userInfo);
        userRoleService.updateUserStatus(userInfo.getUid(),admin);
        System.out.println("userModifyStatus执行成功");
        resultMap.setMessage("修改成功");
        return resultMap;
    }

    /**
     * 修改员工密码 返回视图
     * @return 所有异常
     */
    @RequestMapping(value = "/userupass")
    public String userUpdatePass(){
        return "admin/user/userupass";
    }

    /**
     * 修改员工密码 不包括权限修改,produces="text/html;charset=UTF-8"
     * @param userInfo
     * @return 成功信息
     */
    @ResponseBody
    @RequestMapping(value = "/userupass.do",method = RequestMethod.POST )
    public ResultMap userUpdatePassDo(UserInfo userInfo) throws Exception {
        userRoleService.updatePassword(userInfo);
        resultMap.setMessage("密码更新成功");
        return resultMap;
    }

    /**
     * @param name 模糊查询的姓名
     * @return 返回查询出的员工个人信息
     * @throws Exception 所有异常
     */
    @ResponseBody
    @RequestMapping("/usersearch")
    public ResultMap userSearch(String name) throws Exception {
        List<UserInfo> list = userRoleService.searchUser(name);
        resultMap.setResult("list",list);
        return resultMap;
    }

    /**
     * @param uid 员工ID
     * @return 返回查询出的员工个人信息
     * @throws Exception 所有异常
     */
    @ResponseBody
    @RequestMapping("/search")
    public UserInfo userSearchByUid(Integer uid) throws Exception {
        UserInfo userInfo = userRoleService.searchUserByUid(uid);
        return userInfo;
    }

/**
 * 前后端交互使用的是字符串，一般使用json格式的字符串，当后台给前端发送的header头设置了json浏览器就会解析成json。默认会当成字符串
 * 后台传给前台数据分为 服务器渲染 客户端渲染 jsp就是服务器渲染 ajax就是客户端渲染
 * jsp将所需要呈现的数据在服务器端处理完成，将完整界面发送给浏览器。此时数据传送放在request中，session中，context中。
 * ajax一般使用json格式的字符串传递数据。后台接收json返回给浏览器时，将对象转换成json格式，然后就可以返回数据了，一般使用response的
 * 输出流。
 *
 * springMVC 带有ResponseBody时不会经过视图解析器，会判断返回的格式。
 * 返回值void时不经过
 * 返回值为String 返回值时需要返回的视图名称 经过视图解析器进行组合成完成视图路径
 * 返回值为ModelAndView，将视图，数据什么的都放在ModelAndView对象中。作用域应该是session。
 *
 * springMVC根据参数类型自动绑定参数 可以使用javaBean绑定部分参数，在一个个接收剩余的
 * 在接收参数时会使用spring写好的格式转换器 有些格式转换不满意 可以自己编写自定义格式转换器 然后再配置文件中配置然后启动
 * @ResponseBody 注解是将返回的对象处理成你想要的格式 你可以自己编写 一般转换成json xml格式
 *
 * List<UserInfo> users = null 不可以 需要初始化  List<UserInfo> userInfos = new ArrayList<UserInfo>();
 * List获取数据 使用get（）方法
 */
}
